# -*- coding: UTF-8 -*-
import random

import re
import requests
import time
from bs4 import BeautifulSoup

import common.Logger as Logger
from common.Constants import *

logger = Logger.get_logger(__name__)

# 快速切换Headers User-Agent
def switchHeaders():
    """
    快速切换Headers User-Agent
    headers定义在Constants中
    """
    n = random.randint(1, 3)
    switch = {
        1: headers_1,
        2: headers_2,
        3: headers_3,
    }
    headers = switch[n]

    logger.debug("使用的User-Agent: " + headers["User-Agent"])

    return headers

# 快速切换服务器代理
# Attention: 定义的服务器代理为免费代理，稳定性比较差，谨慎使用
def switchProxy():
    """
    快速切换服务器代理
    proxy定义在Constants中
    Attention: 定义的服务器代理为免费代理，稳定性比较差，谨慎使用
    """
    n = random.randint(1, 3)
    switch = {
        1: proxy_1,
        2: proxy_2,
        3: proxy_3,
    }
    proxy = switch[n]
    return proxy

# 获取request对象
def getRequest(url):
    """
    获取request对象
    :param url: 需要请求的url
    :return: request对象
    """
    requests.adapters.DEFAULT_RETRIES = requests_retry_times
    s = requests.session()
    s.keep_alive = False
    s = requests.get(url, headers=switchHeaders())
    s.encoding = "gbk"

    logger.debug("def [getRequest] is called. URL is %s " % url)
    return s

# 获取post request对象
def getPostRequest(url, requestBody):
    """
    获取post request对象
    :param url: 需要请求的url
    :param requestBody 请求值
    :return: post request对象
    """
    requests.adapters.DEFAULT_RETRIES = requests_retry_times
    s = requests.session()
    s.keep_alive = False
    result = requests.post(url, data=requestBody, headers=switchHeaders())

    logger.debug("def [getPostRequest] is called. URL is %s, requestBody is %s " % (url, requestBody))
    return result

# 使用代理获取request对象
def getRequestByProxy(url):
    """
    使用代理获取request对象
    :param 需要请求的url
    :return: request对象
    """
    request = requests.get(url, headers=switchHeaders(), proxies=switchProxy())
    return request

# 获取BeautifulSoup对象
def getBS(url):
    """
    获取BeautifulSoup对象
    :param url: 需要请求的url
    :return: BeautifulSoup对象
    """
    bs = BeautifulSoup(getRequest(url).text, 'html.parser')
    return bs

# 使用代理获取BeautifulSoup对象
def getBSByProxy(url):
    """
    使用代理获取BeautifulSoup对象
    :param url: 需要请求的url
    :return: BeautifulSoup对象
    """
    bs = BeautifulSoup(getBSByProxy(url).text, 'html.parser')
    return bs

# 过滤不爬取的链接
def filter_unspider_link(list, filterKeyWords):
    """
    过滤不爬取的链接（需使用HeaderLinksUrl的list对象进行过滤）
    :param list: HeaderLinksUrl的list对象
    :param filterKeyWords: 过滤关键字
    :return: 过滤后的list
    """
    for l in list[::-1]:
        for f in filterKeyWords.split(':'):
            if l.name == f:
                list.remove(l)
                logger.debug("除去不爬取父链接：" + l.name + " : " + l.url)
    return list

# 拼接处理相对引用的URL成绝对引用
def restore_absolute_href(absUrl, headerUrl):
    """
    拼接处理相对引用的URL成绝对引用
    :param absUrl: 相对引用的URL
    :param headerUrl: 需要添加的头URL
    :return: 绝对引用的URL
    """
    if absUrl.__contains__("http") | absUrl.__contains__("https"):
        return absUrl
    else:
        return headerUrl + absUrl

# 删除字符串中所有的 \t \r \n 转义字符
def clear_all_trans_chars(str):
    """
    删除字符串中所有的 \t \r \n 转义字符
    :param str: 待处理的字符串
    :return: 无\t\r\n的字符串
    """
    if str.__contains__("\r") | str.__contains__("\t") | str.__contains__("\n"):
        str = str.replace("\r", "").replace("\t", "").replace("\n", "")
    return str

# 每 step 次，程序睡眠 second 秒
def sleep_in_step(count, step, second):
    """
    每 step 次，程序睡眠 second 秒
    :param count: 方法外层for循环记录次数，递增...
    :param step: 步数，每step次
    :param second: 秒数，休息second秒
    """
    if count % step == 0:
        time.sleep(second)

# 获取当前datetime时间
def getNowDateTime():
    """
    获取当前时间
    :return: 当前datetime时间
    """
    return datetime.datetime.now()

# 获取当前time时间
def getNowTime():
    """
    获取当前时间
    :return: 当前time时间
    """
    return time.time()

# 获取指定长度的随机整数
def getIntRandom(number_length):
    """
    获取指定长度的随机数
    :param number_length: 生成随机数数字长度
    :return: 随机整数
    """
    if number_length == 1:
        return str(random.randint(1, 9))
    if number_length == 2:
        return str(random.randint(10, 99))
    if number_length == 3:
        return str(random.randint(100, 999))

# 拼接链接URL
def combineURL(url):
    return url[:url.rfind(".")]+"_list.html"